#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""游戏人物类

主要类：
作战单位
英雄
军队
"""

import random
import time

class Unit:
    # 作战单位 (没有实现所有方法)
    
    def attack(self, other):
        raise '没有实现这个方法'

    def __rshift__(self, other):
        # 魔法方法 self >> other 运算符重载
        self.attack(other)

    def __lshift__(self, other):
        # 魔法方法 self << other 运算符重载
        other.attack(self)


class Hero(Unit):

    def __init__(self, 名字, 血量, 伤害, 速度, 武器, 头像='🙄'):
        # 英雄类的初始化
        # 初始化对象的属性
        self.名字=名字
        self.血量=血量
        self.伤害=伤害 # 每次打击输出
        self.速度=速度 # 每秒打击次数（概率）
        self.头像=头像
        self.武器=武器

    def show(self):
        # 普通方法
        # 美化显示
        if self.isdead():
            print('英雄 %s 挂了 x_x' % self.头像)
        else:
            print('英雄 %s 血量：💧 X %d' % (self.头像, 
            self.血量))

    def attack(self, other):
        # self 攻击 other
        # 普通方法，互动
        if random.random() < self.速度:
            self.attack_anim(other)  # 攻击动画
            other.血量 -= self.伤害

    def attack_anim(self, other):
        # 攻击动画
        print('[英雄 %s 攻击 英雄 %s]' % (self.头像, other.头像))
        time.sleep(0.03)
        for k in range(10):
            print('%s %s %s'%(self.头像, self.武器*k, other.头像))
            time.sleep(0.03)
            print('\n'*5)

    def isdead(self):
        return self.血量<=0

class Army(Unit):
    def __init__(self, name, heros, 头像='🙄'):
        # 初始化方法
        self.name = name
        self.heros = heros
        self.头像 = 头像

    def choose(self):
        # 普通方法
        # 随机选择活的英雄
        return random.choice([hero for hero in self.heros
                    if not hero.isdead()])

    def attack(self, other):
        self.attack_anim(other)
        hero1 = self.choose()
        hero2 = other.choose()
        hero1 >> hero2

    def attack_anim(self, other):
        print(self.name, '攻击', other.name)

    def isdead(self):
        # 列表推导
        return all([hero.isdead() for hero in self.heros])

    def show(self):
        print('军队<%s>:' % self.name)
        for hero in self.heros:
            hero.show()

